/* ----------------------------------------------------------------------
 * Copyright (C) 2010 ARM Limited. All rights reserved.
 *
 * $Date:        29. November 2010
 * $Revision: 	V1.0.3
 *
 * Project: 	    CMSIS DSP Library
 * Title:	    arm_sin_cos_example_f32.c
 *
 * Description:	Example code demonstrating sin and cos calculation of input signal.
 *
 * Target Processor: Cortex-M4/Cortex-M3
 *
 *
 * Version 1.0.3 2010/11/29
 *    Re-organized the CMSIS folders and updated documentation.
 *
 * Version 1.0.1 2010/10/05 KK
 *    Production release and review comments incorporated.
 *
 * Version 1.0.0 2010/09/20 KK
 *    Production release and review comments incorporated.
 * ------------------------------------------------------------------- */

/**
 * @ingroup groupExamples
 */

/**
 * @defgroup SinCosExample SineCosine Example
 *
 * \par Description:
 * \par
 * Demonstrates the Pythagorean trignometric identity with the use of Cosine, Sine, Vector
 * Multiplication, and Vector Addition functions.
 *
 * \par Algorithm:
 * \par
 * Mathematically, the Pythagorean trignometric identity is defined by the following equation:
 *  <pre>sin(x) * sin(x) + cos(x) * cos(x) = 1</pre>
 * where \c x is the angle in radians.
 *
 * \par Block Diagram:
 * \par
 * \image html sinCos.gif
 *
 * \par Variables Description:
 * \par
 * \li \c testInput_f32 array of input angle in radians
 * \li \c testOutput stores sum of the squares of sine and cosine values of input angle
 *
 * \par CMSIS DSP Software Library Functions Used:
 * \par
 * - arm_cos_f32()
 * - arm_sin_f32()
 * - arm_mult_f32()
 * - arm_add_f32()
 *
 * <b> Refer  </b>
 * \link arm_sin_cos_example_f32.c \endlink
 *
 */


/** \example arm_sin_cos_example_f32.c
 */


#include <math.h>
#include "arm_math.h"

/* ----------------------------------------------------------------------
 * Defines each of the tests performed
 * ------------------------------------------------------------------- */
#define MAX_BLOCKSIZE	32
#define DELTA           (0.000001f)


/* ----------------------------------------------------------------------
 * Test input data for Floating point sin_cos example for 32-blockSize
 * Generated by the MATLAB randn() function
 * ------------------------------------------------------------------- */

const float testInput_f32[MAX_BLOCKSIZE] =
{
-1.244916875853235400,
-4.793533929171324800,
 0.360705030233248850,
 0.827929644170887320,
-3.299532218312426900,
 3.427441903227623800,
 3.422401784294607700,
-0.108308165334010680,
 0.941943896490312180,
 0.502609575000365850,
-0.537345278736373500,
 2.088817392965764500,
-1.693168684143455700,
 6.283185307179590700,
-0.392545884746175080,
 0.327893095115825040,
 3.070147440456292300,
 0.170611405884662230,
-0.275275082396073010,
-2.395492805446796300,
 0.847311163536506600,
-3.845517018083148800,
 2.055818378415868300,
 4.672594161978930800,
-1.990923030266425800,
 2.469305197656249500,
 3.609002606064021000,
-4.586736582331667500,
-4.147080139136136300,
 1.643756718868359500,
-1.150866392366494800,
 1.985805026477433800
};

const float testRefOutput_f32 = 1.000000000;

/* ----------------------------------------------------------------------
 * Declare Global variables
 * ------------------------------------------------------------------- */
uint32_t blockSize = 32;
float    testOutput;
float    cosOutput;
float    sinOutput;
float    cosSquareOutput;
float    sinSquareOutput;

/* ----------------------------------------------------------------------
 * Max magnitude FFT Bin test
 * ------------------------------------------------------------------- */


void setup(void)
{
  float diff;
  uint32_t i;
  arm_status status;

  Serial.begin(9600);
  while (!Serial);
  delay(200);
  Serial.println("Test Sine, Cosine, and Vector Addition & Multiplication");

  status = ARM_MATH_SUCCESS;

  for (i=0; i< blockSize; i++) {
    cosOutput = arm_cos_f32(testInput_f32[i]);
    sinOutput = arm_sin_f32(testInput_f32[i]);

    arm_mult_f32(&cosOutput, &cosOutput, &cosSquareOutput, 1);
    arm_mult_f32(&sinOutput, &sinOutput, &sinSquareOutput, 1);

    arm_add_f32(&cosSquareOutput, &sinSquareOutput, &testOutput, 1);

    /* absolute value of difference between ref and test */
    diff = fabsf(testRefOutput_f32 - testOutput);

    /* Comparison of sin_cos value with reference */
    if (diff > DELTA) {
      status = ARM_MATH_TEST_FAILURE;
    }
  }
  if (status != ARM_MATH_SUCCESS) {
    Serial.print("Failed");
  } else {
    Serial.print("Success");
  }
}
void loop(void) {}


